package com.example.proxy.service;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * ClassName:TimerInvocationHandler
 * Package:com.example.proxy.service
 * Description:
 *
 * @Author:ZhangXin
 * @Create:2023/5/10-16:14
 * @Version:v1.0
 */
//专门负者计时的一个调用处理器对象
public class TimerInvocationHandler implements InvocationHandler {

    public Object target;

    public TimerInvocationHandler(Object target) {
        this.target = target;
    }

    /*
     * 1.invoke方法是JDK调用
     * 2.invoke方法什么时候被调用
     * 当代理对象调用代理方法的时候,注册在InvocationHandler调用处理器当中的invoke()方法被调用
     *
     * 3.invoke方法的三个参数
     * 第一个参数：Object proxy  代理对象引用
     * 第二个参数：Method method 目标对象上的目标方法
     * 第三个参数：Object[] args 目标方法上的实参
     * */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //这个接口的目的就是为了写增强代码

        //调用目标对象上的目标方法
        //方法四要素：哪个对象,哪个方法,传什么参数,返回什么值
        long begin = System.currentTimeMillis();
        Object invoke = method.invoke(target, args);
        long end = System.currentTimeMillis();
        System.out.println("耗时" + (end - begin) + "毫秒");


        //返回结果
        return invoke;
    }
}
